// 路由鉴权：某一路由在什么条件下可以访问，什么条件下不能访问
import router from '@/router';
import nprogress from 'nprogress';
// 引入进度条样式
import 'nprogress/nprogress.css';
import { useUserStore } from '@/store/modules/user';
import projectSetting from '@/setting';
import { ElNotification } from 'element-plus';

// 取消进度条加载小圆圈
nprogress.configure({ showSpinner: false });

// 全局前置路由守卫
// to：要访问的路由
// from: 从哪个路由而来
// next: 路由的放行函数
router.beforeEach(async (to: any, from: any, next: any) => {

    // 用户仓库对象
    const userStore = useUserStore();

    // 进度条的启动
    nprogress.start();
    // 获取token
    let token = userStore.token;
    console.log("路由守卫获取了token的值", token);
    // 获取用户名
    let username = userStore.username;

    // 权限鉴定，判断用户是否登录
    if (token) {// 用户已登录
        if (to.path === '/login') {
            // 要访问登录页面,但不能访问，跳转首页
            next('/');
        } else { // 访问其他页面
            // 防止页面刷新，pinia中的用户信息丢失(未持久化) 
            if (username) {
                // 用户信息存在，则放行
                next();
            } else {
                // 用户信息不存在则去获取用户信息
                try {
                    await userStore.getUserInfo();
                    // 若使用动态路由，当页面刷新时，动态路由可能会未加载完毕，会出现空白效果
                    next(to.path);
                } catch (err) {
                    // 获取用户信息出错，说明token过期
                    // 1. 给出错误提示
                    ElNotification({
                        type: "error",
                        // 使用TS的类型断言将变量认定是某个类型
                        message: (err as Error).message,
                    });

                    // 2、退出登录，清空用户信息(异步请求)
                    await userStore.userLogout();
                    // 3、跳转登录页
                    next(`/login?redirect=${to.path}`);
                }
            }
        }
    } else {// 用户未登录
        if (to.path === '/login') {
            next();
        } else {
            next(`/login?redirect=${to.path}`);
        }
    }
})

// 全局后置路由守卫
router.afterEach((to, from) => {
    // 进度条的结束
    nprogress.done();

    // 设置标签页名称
    document.title = `${projectSetting.title} - ${to.meta.title}`;
});

/**
 * 路由鉴权考虑
 *  1、未登录，只能访问登录路由，其余路由不能访问
 *  2、登录后，不能访问登录路由，其余路由都能访问
 */